package com.example.admin.util.inner;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;


/**
 *
 * 加载RSA PEM格式的密钥文件
 * 1.读取PEM文件：首先需要读取PEM文件的内容到一个字符串或字节数组中。
 * 2.解析PEM数据：PEM文件通常包含了Base64编码的数据块，并且以-----BEGIN ...-----和-----END ...-----标记开始和结束。需要提取这些数据块并进行Base64解码。
 * 3.转换为密钥对象：将解码后的数据转换成Java安全框架中的PublicKey或PrivateKey对象。
 * @author TONGYI Lingma
 */
public class RSAKeyLoader {

    /**
     * 从PEM文件中加载公钥
     * @param filePath 文件路径
     * @return PublicKey 公钥对象
     * @throws Exception 如果加载失败
     */
    public static PublicKey loadPublicKeyFromPem(String filePath) throws Exception {
        byte[] keyBytes = readKey(filePath);
        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }

    /**
     * 从PEM文件中加载私钥
     * @param filePath 文件路径
     * @return PrivateKey 私钥对象
     * @throws Exception 如果加载失败
     */
    public static PrivateKey loadPrivateKeyFromPem(String filePath) throws Exception {
        byte[] keyBytes = readKey(filePath);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePrivate(spec);
    }

    /**
     * 读取PEM文件内容
     * @param filePath 文件路径
     * @return byte[] 文件内容
     * @throws IOException 如果读取失败
     */
    private static byte[] readKey(String filePath) throws IOException {
        StringBuilder keyContentBuilder = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                if (!line.startsWith("-----")) {
                    keyContentBuilder.append(line);
                }
            }
        }
        return Base64.getDecoder().decode(keyContentBuilder.toString());
    }

    // 测试方法
    public static void main(String[] args) {
        try {
            PublicKey publicKey = loadPublicKeyFromPem("D:/tools/gen_key/public_key.pem");
            PrivateKey privateKey = loadPrivateKeyFromPem("D:/tools/gen_key/private_key.pem");

            System.out.println("Public Key: " + convertKeyToString(publicKey));
            System.out.println("Private Key: " + convertKeyToString(privateKey));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    /**
     * 将公钥或私钥转换为字符串
     * @param key 密钥对象
     * @return String 密钥字符串
     */
    public static String convertKeyToString(java.security.Key key) {
        byte[] keyBytes = key.getEncoded();
        return Base64.getEncoder().encodeToString(keyBytes);
    }
}
